<?php
/*
 * +----------------------------------------------------------------------
 * 作 者: xinglou <xinglou1@foxmail.com>
 * +----------------------------------------------------------------------
 * 创建日期：2015-06-24
 * +----------------------------------------------------------------------
 * 文件描述：用户管理
 * +----------------------------------------------------------------------
 * 升级记录：
 * +----------------------------------------------------------------------
 */
header("Content-Type:text/html;Charset=utf-8");

class UserAction extends CommonAction
{

    /**
     * 系统用户管理
     */
    public function index()
    {
        $model = new UserModel();
        
        // 条件检索
        if (! empty($_REQUEST['search_keyword'])) {
            $where['id|name|real_name|phone'] = array(
                'like',
                '%' . $this->_request('search_keyword') . '%'
            );
        }
        
        // 通过省市县检索
        if (! empty($_REQUEST['area_code'])) {
            $where['area_code'] = $this->_request('area_code');
        } elseif (empty($_REQUEST['area_code']) && ! empty($_REQUEST['city_code'])) {
            $where['area_code'] = array(
                'like',
                $this->_request('city_code') . '%'
            );
        } elseif (empty($_REQUEST['area_code']) && empty($_REQUEST['city_code']) && ! empty($_REQUEST['province_code'])) {
            $where['area_code'] = array(
                'like',
                $this->_request('province_code') . '%'
            );
        }
        
        // 分页处理
        import('ORG.Util.Page'); // 导入分页类
        $count = $model->where($where)->count(); // 查询满足要求的总记录数
        $p = $this->_page($model, 'id'); // 分页所需信息
        $page = new Page($count, $p['listRows']); // 实例化分页类 传入总记录数和每页显示的记录数
        $data = $model->field("id,
 								name,
 								real_name,
 								get_field_dict_name('user', 'gender', gender) gender,
 								phone,
 								get_field_dict_name('user', 'type', type) type,
 								get_area_name(area_code) area,
 								remark,
 								get_field_dict_name('user', 'status', status) status,
 								get_user_name(operator) operator,
								update_date")
            ->where($where)
            ->order("`" . $p['order'] . "` " . $p['sort'])
            ->limit($page->firstRow . ', ' . $page->listRows)
            ->select();
        $this->assign('data', $data);
        $show = $page->show(); // 分页显示输出
        $this->assign('show', $show); // 绑定分页显示字符串
        $this->assign('province_list', get_province_list()); // 省份列表
                                                             
        // 查询该省份下的市州列表
        if (! empty($_REQUEST['province_code'])) {
            $model = new CityModel();
            $city_list = $model->field("code, name")
                ->where("province_code = '" . $this->_request('province_code') . "'")
                ->select();
            $this->assign('city_list', $city_list);
        }
        
        // 查询该市州下的县区列表
        if (! empty($_REQUEST['city_code'])) {
            $model = new AreaModel();
            $area_list = $model->field("code, name")
                ->where("city_code = '" . $this->_request('city_code') . "'")
                ->select();
            $this->assign('area_list', $area_list);
        }
        $this->display();
    }

    /**
     * 添加用户
     */
    public function add()
    {
        $this->assign('province_list', get_province_list()); // 省份列表
        $this->assign('gender_list', set_field_dict_list('user', 'gender'));
        $this->assign('type_list', set_field_dict_list('user', 'type'));
        $this->assign('status_list', set_field_dict_list('user', 'status'));
        $this->display();
    }

    /**
     * 将用户信息添加至数据库
     */
    public function insert()
    {
        $data = $this->add_user($this->_request(), $msg);
        if (false !== $data) {
            $this->success($msg, __APP__ . '?g=Admin&m=User&a=index');
        } else {
            $this->error($msg);
        }
    }

    /**
     * 修改用户信息页面显示
     */
    public function edit()
    {
        // 查询当前用户信息
        $model = new UserModel();
        $data = $model->where("id = '" . $this->_request('id') . "'")
            ->find();
        if (empty($data)) {
            $this->error('未找到您要修改的用户信息！');
        }
        $this->assign('data', $data);
        
        // 获取当前用户的省份编码
        $province_code = substr($data['area_code'], 0, 2);
        $this->assign('province_code', $province_code);
        
        // 获取当前用户的市州编码
        $city_code = substr($data['area_code'], 0, 4);
        $this->assign('city_code', $city_code);
        
        // 省市县联动信息绑定
        $this->assign('province_list', get_province_list()); // 省份列表
        $this->assign('city_list', get_city_list($province_code)); // 市州列表
        $this->assign('area_list', get_area_list($city_code)); // 县区列表
                                                               
        // 数据字典信息绑定
        $this->assign('gender_list', set_field_dict_list('user', 'gender'));
        $this->assign('type_list', set_field_dict_list('user', 'type'));
        $this->assign('status_list', set_field_dict_list('user', 'status'));
        $this->display();
    }

    /**
     * 更新用户信息至数据库
     */
    public function update()
    {
        $data = $this->update_user($this->_request(), $msg);
        if (false !== $data) {
            redirect(__APP__ . '?g=Admin&m=User&a=index');
        } else {
            $this->error($msg);
        }
    }

    /**
     * 删除用户信息
     */
    public function delete()
    {
        $userIds = $this->_request('ids');
        if (false !== $this->delete_user($userIds, $msg)) {
            redirect($_SERVER['HTTP_REFERER']);
        } else {
            $this->error($msg);
        }
    }

    /**
     * 添加用户【供其他模块调用】
     */
    public function add_user($post_data, &$msg)
    {
        $model = new UserModel();
        if (! empty($post_data['pwd'])) {
            $post_data['pwd'] = md5($post_data['pwd']);
        }
        $area_code = empty($_REQUEST['area_code']) ? (empty($_REQUEST['city_code']) ? $_REQUEST['province_code'] : $_REQUEST['city_code']) : $_REQUEST['area_code'];
        $post_data['area_code'] = $area_code;
        if (false !== $model->create($post_data, 1)) {
            $insertId = $model->add();
            if (false !== $insertId) {
                $msg = '用户添加成功！';
                return $insertId;
            } else {
                $msg = '用户添加失败！';
                return false;
            }
        } else {
            $msg = '用户添加失败！' . $model->getError();
            return false;
        }
    }

    /**
     * 更新用户【供其他模块调用】
     * 
     * @param unknown $post_data            
     * @param unknown $msg            
     */
    public function update_user($post_data, &$msg)
    {
        $model = new UserModel();
        
        // 对密码字段作特殊处理
        if (! empty($post_data['pwd'])) {
            $post_data['pwd'] = md5($post_data['pwd']);
        } else {
            unset($post_data['pwd']);
        }
        $area_code = empty($_REQUEST['area_code']) ? (empty($_REQUEST['city_code']) ? $_REQUEST['province_code'] : $_REQUEST['city_code']) : $_REQUEST['area_code'];
        $post_data['area_code'] = $area_code;
        if (false !== $model->create($post_data, 0)) {
            if (false !== $model->save()) {
                $msg = '用户修改成功！';
                return true;
            } else {
                $msg = '用户修改失败！';
                return false;
            }
        } else {
            $msg = '用户修改失败！' . $model->getError();
            return false;
        }
    }

    /**
     * 删除用户【供其他模块调用】
     * 
     * @param array $userIds            
     * @param
     *            string &$msg
     * @return boolean
     */
    public function delete_user($userIds, &$msg)
    {
        if (! empty($userIds) && is_array($userIds)) {
            $model = new UserModel();
            $model->startTrans();
            $id = implode("','", $userIds); // 用','分割id数组，以便于拼装sql语句
            $id = "'" . $id . "'"; // 拼装sql语句，结果为'firstId','secondId',…
            if (false !== $model->where("id in(" . $id . ")")->delete()) {
                $msg = '用户删除成功！';
                $model->commit();
                return true;
            } else {
                $msg = '用户删除失败！';
                $model->rollback();
                return false;
            }
        } else {
            $msg = '您未选中任何记录！';
            return false;
        }
    }

    /**
     * 通过Validform框架实时验证【用户名】的唯一性
     * ajaxurl指定的文件可以接收到Post过来的两个值，分别是param和name，param是该元素的值，name是该元素的name名称。可以通过区别name来把一个表单下，多个实时验证请求，都指定到同一个文件。
     */
    public function check_username()
    {
        if (! empty($_REQUEST['userid'])) {
            $where['_string'] = "id <> '" . $this->_request('userid') . "'"; // 此条件用于修改用户信息时用户名查重检测（查重时忽略本身的用户名）
        }
        $where['name'] = $this->_request('param');
        $model = new UserModel();
        $userid = $model->where($where)->getField('id');
        
        // 若数据库中该用户名不存在，则该用户名可以使用
        if (empty($userid)) {
            echo 'y'; // Validform实时验证成功时只能输出'y'，其它任何字符将作为验证失败提示信息返回
        } else {
            echo '该用户名已经存在，请选择其他！';
        }
    }

    /**
     * 重置密码
     */
    public function reset_pwd()
    {
        $model = new UserModel();
        if (false !== $model->where("id = '" . $this->_request('userid') . "'")
            ->setField('pwd', md5(C('PASSWORD')))) {
            $this->ajaxReturn(null, "密码重置成功", 1);
        } else {
            $this->ajaxReturn(null, "密码重置失败", 0);
        }
    }

    /**
     * 查询当前用户已授权的角色
     */
    public function select_role()
    {
        // 用户编号
        $userid = $this->_request('userid');
        $this->assign('userid', $userid); // 未处理之前重新绑定，需传递到下一个提交的地址
                                          
        // 查询当前用户已授权的角色
        $model = new UserRoleModel();
        $data = $model->where("userid = '" . $userid . "'")->getField('roleid', true);
        $this->assign('roleIds', implode(',', $data)); // 将页面编号数组用逗号分割成字符串并绑定到前台
                                                       
        // 查询角色列表
        $page = new RoleModel();
        $list = $page->field("id,
							   name")
            ->where("status = 'a'")
            ->order('seq')
            ->select();
        $this->assign('list', $list);
        $this->display();
    }

    /**
     * 批量为用户设置角色
     */
    public function set_user_role()
    {
        $userid = $this->_request('userid');
        $roleIds = $this->_request('roleid');
        
        $model = new UserRoleModel();
        $model->startTrans(); // 启动事务
                              
        // 删掉当前用户的历史授权信息
        if (false === $model->where("userid = '" . $userid . "'")->delete()) {
            $model->rollback(); // 回滚事务
            $this->success('历史授权信息删除失败！');
        }
        
        foreach ($roleIds as $value) {
            $add_data['userid'] = $userid;
            $add_data['roleid'] = $value;
            
            // 将页面授权信息添加至数据库
            $data = $model->create($add_data, 1);
            if (false !== $data) {
                if (false === $model->add()) {
                    $model->rollback(); // 回滚事务
                    $this->error('角色授权失败！');
                }
            } else {
                $model->rollback(); // 回滚事务
                $this->error('角色授权失败！' . $model->getError());
            }
        }
        
        $model->commit(); // 提交事务
        $this->success('角色授权成功！');
    }
}
?>